/*
* ################################################################################
* ### MIT License
* ################################################################################
* 
* Copyright (c) 2006-2011 Andy Turner
* 
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
* 
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
* 
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include "vtkPolyDataReader.h"
#include "vtkQuadricDecimation.h"
#include "vtkDecimatePro.h"
#include "vtkPolyDataWriter.h"
#include "vtkPolyData.h"
#include "vtkPolyDataNormals.h"

#include <iostream>

#include "Useful/PrintMacros.h"

int main(int argc, char** argv)
{
   if (argc < 4)
   {
      std::cerr << "Usage: DecimateMesh <input filename> <decimation level [0..1]> <output filename>" << std::endl;
      DEBUGLINEANDEXIT(1);
   }

   vtkPolyDataReader* reader = vtkPolyDataReader::New();
   reader->SetFileName(argv[1]);

#ifdef _USEQUADRIC
   vtkQuadricDecimation* decim = vtkQuadricDecimation::New();
#else
   vtkDecimatePro* decim = vtkDecimatePro::New();
   decim->PreserveTopologyOn();
   decim->SplittingOff();
#endif

   PRINTVBL(decim->GetClassName());

   decim->SetInputConnection(reader->GetOutputPort());
   decim->SetTargetReduction(atof(argv[2]));

   /*
   vtkPolyDataNormals* norm = vtkPolyDataNormals::New();
   norm->SetInputConnection(decim->GetOutputPort());
   norm->SplittingOff();
   */

   vtkPolyDataWriter* writer = vtkPolyDataWriter::New();
   writer->SetInputConnection(decim->GetOutputPort());
   writer->SetFileName(argv[3]);

   writer->Update();

   std::cerr << "Original number of cells: " << reader->GetOutput()->GetNumberOfCells() << std::endl;
   std::cerr << "Final number of cells: " << decim->GetOutput()->GetNumberOfCells() << std::endl;

   std::cerr << "Achieved decimation: " << (1.0-(decim->GetOutput()->GetNumberOfCells()*1.0)/(reader->GetOutput()->GetNumberOfCells()+0.0)) << std::endl;

   //norm->Delete();
   writer->Delete();
   decim->Delete();
   reader->Delete();
}